import Axios from "axios";
import { error, success } from "@/util/ElMessage";
import { useUserinfoStore } from "@/stores/userinfo";
import router from "@/routers";
const userinfo = useUserinfoStore();
const axios = Axios.create({
	//添加代理解决跨域问题
	baseURL: import.meta.env.VITE_BASE_URL,
	//设置超时时间
	timeout: 8000
});
const token = useUserinfoStore().token;
//请求拦截器（发送之前）
axios.interceptors.request.use(
	config => {
		config.timeStart = Number(new Date());
		if (token) {
			config.headers!.Authorization = `Bearer ${token}`;
		}

		return config;
	},
	error => {
		error(error.message);
		return Promise.reject(error);
	}
);
//响应拦截器（发送之后）
//如果是后端error()函数抛出的错误要让用户看到
//如果后端都不知道是什么错误，前端不应该让用户看到具体错误，而是给每个异步请求加上catch()告诉这里具体那个业务出现了错误,然后后端通过错误处理中间件打印具体错误
axios.interceptors.response.use(
	response => {
		response.config.timeDiff = Number(new Date()) - Number(response.config.timeStart);
		console.log(response);
		if (response.data.code === 401) {
			error(response.data.message);
			userinfo.setToken("");
			router.push("/login");
			return Promise.reject(response.data);
		}
		//如果成功返回但code!=200，说明这是服务端已知的错误，应该让用户看到
		else if (response.data.code !== 200) {
			error(response.data.message);
			return Promise.reject(response.data);
		} else if (response.config.method !== "get") {
			//如果成功返回且code==200,说明业务已经完成
			//且不是查询操作，直接返回服务端给出的成功消息，不用.then()告诉用户成功了，服务端会有成功的返回值
			success(response.data.message);
		}
		return response;
	},
	err => {
		//如果直接抛出错误，说明这是服务端未捕获到的错误，服务器内部出错，应该在后端打印，前端只用.catch()告诉用户这个业务错误了，不用告诉具体内容
		err.config.timeDiff = Number(new Date()) - Number(err.config.timeStart);

		console.error(err);
		if (err.message === "Network Error") {
			error("网络错误,请检查您的网络是否正常");
		} else if (err.message.includes("timeout")) {
			error("请求超时，请稍后重试");
		}
		// 添加其它异常处理
		return Promise.reject(err);
	}
);
export default axios;
